package msgcomm.messages;

import java.io.Serializable;

/**
 * Il messaggio. Comprende l'identificativo del mittente e il payload.
 * Per inviare dati diversi e' necessario estendere la classe <code>Payload</code>.
 * Non e' presente il destinatario in quanto e' implicito.
 * 
 * Mittente  e sequence number rendono ogni messaggio unico.
 */
public class Message implements Serializable {

	private static final long serialVersionUID = 5662445885925646215L;
	
	/**
	 * Sequence number: automaticamente incrementato ad ogni creazione di messaggio
	 */
	private static Integer sequenceNumber= 0;
	
	/**
	 * Mittente del messaggio
	 */
	private final String sender;

	/**
	 * Il sequence number
	 */
	private final int seqNum;
	
	/**
	 * Dati-utente presenti nel messaggio
	 */
	private final Payload data;
	
	/**
	 * Crea un nuovo messaggio
	 * @param sender identificativo del mittente
	 * @param data dati da spedire
	 */
	public Message(String sender, Payload data) {
		this.sender= sender;
		synchronized (Message.sequenceNumber) {
			this.seqNum= Message.sequenceNumber;
			Message.sequenceNumber++;
		}
		this.data= data;
	}
	

	/**
	 * Estre il mittente del messaggio
	 * @return vedi descrizione
	 */
	public String getSender() {
		return sender;
	}

	/**
	 * Estrae il payload del messaggio
	 * @return vedi descrizione
	 */
	public Payload getPayload() {
		return data;
	}
	
	/**
	 * Estrae il sequence number dal messaggio
	 * @return vedi descrizione
	 */
	public int getSeqNum() {
		return seqNum;
	}
	
	@Override
	public String toString() {
		return "Message[" + rawToString() + "]";
	}
	
	protected String rawToString() {
		return sender + ", #" + seqNum + ", " + data;
	}
}
